package com.codeyang.controller.system;

import com.codeyang.domain.DictType;
import com.codeyang.dto.DictTypeDto;
import com.codeyang.service.DictTypeService;
import com.codeyang.utils.AjaxResult;
import com.codeyang.utils.ShiroSecurityUtils;
import com.codeyang.vo.DataGridView;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.Arrays;
import java.util.List;

/**
 * 描述: 字典类型控制器
 *
 * @author CodeYang_Site
 * @version 2021/4/21 14:11
 */
@RestController
@RequestMapping("/system/dict/type")
public class DictTypeController {

    @Autowired
    private DictTypeService dictTypeService;

    /**
     * 分页查询字典
     *
     * @param dictTypeDto 接收前端的参数
     * @return
     */
    @GetMapping("/listForPage")
    public AjaxResult listForPage(DictTypeDto dictTypeDto) {

        DataGridView dataGridView = dictTypeService.lisPage(dictTypeDto);
        return AjaxResult.success("数据加载成功", dataGridView.getData(), dataGridView.getTotal());
    }


    /**
     * 新增数据
     * 关于时间的数据的写入与显示
     * mysql url 控制写入时间 serverTimezone=GMT%2B8
     * 消息转换器 jackson 控制写出时间 显示时间
     *
     * @param dictTypeDto 验证数据
     * @return
     */
    @PostMapping("/addDictType")
    public AjaxResult addDictType(@Validated DictTypeDto dictTypeDto) {
        // 这两行代码以后可能经常使用 后面可以封装起来
        dictTypeDto.setSimpleUser(ShiroSecurityUtils.getCurrentSimpleUser());

        boolean isSaveOk = dictTypeService.saveDictType(dictTypeDto);
        return isSaveOk ? AjaxResult.success() : AjaxResult.fail("新增失败");
    }

    /**
     * 修改数据
     *
     * @param dictTypeDto
     * @return
     */
    @PutMapping("/updateDictType")
    public AjaxResult updateDictType(@Validated DictTypeDto dictTypeDto) {
        dictTypeDto.setSimpleUser(ShiroSecurityUtils.getCurrentSimpleUser());

        boolean flage = dictTypeService.updateDictType(dictTypeDto);
        return flage ? AjaxResult.success() : AjaxResult.fail("修改失败");

    }

    /**
     * 删除
     *
     * @param ids
     * @return
     */
    @DeleteMapping("/deleteDictTypeByIds/{ids}")
    public AjaxResult deleteDictTypeByIds(@PathVariable("ids") Long[] ids) {
        /**
         * 逻辑删除: 普通的用户: 做逻辑删除,如果项目强制要求使用逻辑删除
         * 物理删除: 管理员做物理删除
         */
        boolean flag = dictTypeService.removeByIds(Arrays.asList(ids));

        return flag ? AjaxResult.success() : AjaxResult.fail("删除失败");
    }

    /**
     * 根据id获取一条记录
     *
     * @param id
     * @return
     */
    @GetMapping("/getOne/{id}")
    public AjaxResult getOne(@PathVariable("id") Long id) {
        return AjaxResult.success(dictTypeService.getById(id));
    }

    /**
     * 同步缓存 将字典里的所有数据都缓存起来
     * 使用redis实现
     * key : 字典类型
     * val : list<字典数据>
     *
     * @return
     */
    @GetMapping("/dictCacheAsync")
    public AjaxResult dictCacheAsync() {

        dictTypeService.dictCacheAsync();
        return AjaxResult.success();
    }

    /**
     * 查询所有的字典类型
     *
     * @return
     */
    @GetMapping("/selectAllDictType")
    public AjaxResult selectAllDictType() {
        List<DictType> list = dictTypeService.list();
        return AjaxResult.success(list);
    }


}
